"""自定义文件存储类,把文件上传保存到FastDFS系统中"""
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from django.conf import settings
from fdfs_client.client import Fdfs_client

@deconstructible
class FastDFSStorage(Storage):
    def __init__(self,base_url=None, client_conf=None):
        """
        初始化
        :param base_url: 用于构造图片完整路径使用，图片服务器的域名
        :param client_conf: FastDFS客户端配置文件的路径
        """
        if base_url is None:
            self.base_url = settings.FDFS_URL
        if client_conf is None:
            self.client_conf = settings.FDFS_CLIENT_CONF
        self.fastDFS = Fdfs_client(self.client_conf)

    def _open(self, name, mode='rb'):
        """
        用不到打开文件，所以省略
        """
        pass

    def _save(self, name, content):
        ret = self.fastDFS.upload_by_buffer(content.read())
        if ret.get("Status") == 'Upload successed.':
            """上传成功"""
            return ret.get("Remote file_id")
        else:
            """上传失败"""
            raise Exception("upload file failed")

    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name

    def exists(self, name):
        """
        判断文件是否存在，解决文件去重，
        方案1：在这里直接针对文件进行sha1_fiels获取文件的指纹进行判断
        方案2：FastDFS可以自行解决文件的重名问题[FastDHT]
              https://www.cnblogs.com/findumars/p/6124348.html
        所以此处返回False，告诉Django上传的都是新文件

        :param name:  文件名
        :return: False
        """
        return False